'''
项目：银行ATM
日期：2020/1/30
作者：林靖和
功能：实现方式不限
(1)登录验证：用户输入用户名密码登陆，检测用户名是否存在以及用户名密码是否匹配；
             用户名密码各有三次输入机会，超过三次系统退出。
(2)菜单界面：登陆成功后显示功能操作界面，输入序号选择对应功能。
(3)用户注册：用户可以输入用户名和密码创建自己的账号，并输入电话号码等信息，
             如果用户名存在则让用户重新输入用户名。注册后免费赠送5000元余额。
(4)账户管理：用户可以随时查看自己的账户余额。用户可以输入其他账户用户名，实现转账功能；
             用户名必须存在，用户可以模拟实现存取款功能。
(5)管理员：管理员的用户名和密码可以预先初始化；
           管理员可以查看其它用户的用户名和密码。
'''
'''主函数（程序启动）'''
def main():
    global user_password#全局变量-用户信息（功能：储存用户信息[用户名:密码:余额]）
    administrators = ["lin", "123", 0]#创建管理员的信息（账号和密码以及余额）
    user_password = [administrators]#存储管理员的信息（账号和密码以及余额）
    log_reg()#进入注册、登录界面
'''注册、登录界面'''
def log_reg():
    #输出程序界面，用户选择注册or登录
    print("  程   序  ")
    print("1、注册账号")
    print("2、登录账号")
    choose = input("选择服务：")#用户选择相应的服务
    if choose == "1":#选择注册账号
        registeration()#进入注册函数
    elif choose == "2":#选择登录账号
        logon(1)#进入登录函数
    else:#用户输入错误的情况处理
        print("无此服务，请输入正确的服务序号！")#输出错误，提醒用户
        log_reg()#重新进入注册、登录界面
'''注册函数'''
def registeration():
    user_registr = input("注册账号：")#用户输入注册的账号
    for num in range(len(user_password)):#循环查询账号是否存在，循环次数num由用户信息列表长度决定
        if user_registr == user_password[num][0]:#此时查到用户已存在
            print("用户名已存在!")#输出错误，提醒用户
            registeration()#重新进入注册函数
    password_registr = input("注册密码：")#用户输入注册的密码
    element = [user_registr,password_registr,5000]#创建该用户的信息（单一用户）
    user_password.append(element)#将该用户信息存入集体用户信息中（集体用户）
    print("注册成功，并赠送5000余额，请查看！")#提醒用户注册成功
    log_reg()#自动返回到注册、登录界面
'''登录函数'''
def logon(times):
    global user #全局变量用户名（功能：记录当前登录用户的用户名）
    global password #全局变量密码（功能：记录当前登录用户的密码）
    user = input("账号：")#用户输入登录的账号
    password = input("密码：")#用户输入登录的密码
    #循环判断账号是否存在以及账号和密码是否匹配
    for num in range(len(user_password)):#循环次数num由用户信息列表长度决定
        if user_password[num][0] == user and user_password[num][1] == password:#信息存在且匹配
            print("登录成功！")#提醒用户登录成功
            menu()#进入主菜单界面
            #从menu()出来前，用户选择了退出程序
            times = 3#为了不做后续程序，直接把times定为3
            break#登录成功后不用做后续的操作
    #判断登录次数是否到达三次
    if times == 3:#登录次数达到三次
        leave(0)#进入退出函数
    else:
        print("登录失败！")#提醒用户登录失败（用户名和密码匹配失败）
        logon(times+1)#再次进入登录函数（递归）
'''主菜单界面（选择服务）'''
def menu():
    #输出菜单界面，用户选择服务
    print("  菜   单  ")
    print("1、查询余额")
    print("2、存    款")
    print("3、取    款")
    print("4、转    账")
    print("5、用户信息")
    print("6、退    出")
    choose = input("选择服务：")#用户选择需要的服务
    if choose == "1":#用户选择服务：查询（余额）
        enquiry()#进入查询（余额）函数
    elif choose == "2":#用户选择服务：存款
        deposit()#进入存款函数
    elif choose == "3":#用户选择服务：取款
        withdrawal()#进入取款函数
    elif choose == "4":#用户选择服务：转账
        transfer_account()#进入取款函数
    elif choose == "5":#用户选择服务：查询（当前所有用户信息）
        if user == user_password[0][0]:#如果登录的账户为管理员账户，可进行该功能
            user_information()#进入查询（当前所有用户信息）函数
        else:
            print("没有该权限")#如果登录的账号不是管理员账户，不可进行该功能
            menu()#重新进入主菜单界面
    elif choose == "6":#用户选择退出
        leave(1)#进入退出函数
    else:
        print("无此服务，请输入正确的服务序号！")#用户输入错误的情况处理
        menu()#重新进入主菜单界面
'''服务：查询（余额）'''
def enquiry():
    for num in range(len(user_password)):#循环查找对应的用户名，循环次数num由用户信息列表长度决定
        if user == user_password[num][0]:#找到对应的用户名
            print("余额：{}".format(user_password[num][2]))#输出对应用户的余额
            break#输出后不用继续循环操作
    input("按回车键继续...")#按回车键继续
    menu()#返回主菜单界面
'''服务：存款'''
def deposit():
    money = int(input("输入存款金额："))#用户输入存款金额
    for num in range(len(user_password)):#循环查找对应的用户名，循环次数num由用户信息列表长度决定
        if user == user_password[num][0]:#找到对应的用户名
            user_password[num][2] += money
            print("存入金额：{}".format(money))
            print("余额：{}".format(user_password[num][2]))
    menu()#返回主菜单界面
'''服务：取款'''
def withdrawal():
    money = int(input ("输入取款金额："))#用户输入取款金额
    for num in range(len(user_password)):#循环查找对应的用户名，循环次数num由用户信息列表长度决定
        if user == user_password[num][0]:#找到对应的用户名
            if money <= user_password[num][2]:#如果余额足够，执行后续操作
                user_password[num][2] -= money
                print("取出金额：{}".format(money))
                print("余额：{}".format(user_password[num][2]))
            else:#如果余额不足，则提醒用户
                print("余额不足！")
    menu()#返回主菜单界面
'''服务：转账'''
def transfer_account():
    account=input("输入对方账户：")
    for num in range(len(user_password)):#循环查找对应的用户名，循环次数num由用户信息列表长度决定
        if account == user_password[num][0]:#找到对应的用户名（对方用户）
            number = num#记录对方用户位置（下标）
            break#记录后不用继续循环操作
        else:#与对方用户不匹配
            if num+1 == len(user_password):#如果判断到最后一个用户，则输出该用户不存在
                print("该用户不存在")
                menu()#返回主菜单界面
    money = int(input("输入转账金额："))#如果找到对应用户，则输入转账金额
    for num in range(len(user_password)):#循环查找对应的用户名，循环次数num由用户信息列表长度决定
        if user == user_password[num][0]:#找到对应的用户名（操作用户）
            if money <= user_password[num][2]:#如果余额足够，执行后续操作
                user_password[num][2] -= money
                user_password[number][2] += money
                print("转账成功！")
            else:#如果余额不足，提醒用户
                print("余额不足！")
    menu()#返回主菜单界面
'''服务：查询（当前所有用户信息）'''
def user_information():
    print("[用户名：密码]")
    for num in range(len(user_password)):#依次输出用户信息
        print("{}、[{}:{}]".format(num+1,user_password[num][0],user_password[num][1]))
    input("按回车键继续...")
    menu()#返回主菜单界面
'''退出函数（退出账号or程序）'''
def leave(status):#status:状态
    if status == 1:#status为1时选择退出方式（账号or程序）
        print(" 退出选择 ")
        print("1、退出账号")
        print("2、退出程序")
        choose = input("选择退出方式：")
        if choose == "1":
            log_reg()#退出账号，回到注册、登录界面
        elif choose == "2":
            pass#退出程序，不需要任何操作（原因：后续登录函数中还会进行leave(0)，输出不会重复）
        else:
            print("输入错误，请输入正确的序号！")  # 用户输入错误的情况处理
    elif status == 0:#status为0时直接退出程序
        print("程序已退出！")
    else:
        print("输入错误，请输入正确的序号！")#用户输入错误的情况处理
if __name__ == '__main__':
    main()
    # 函数里面有参数传递，你试试参数传递的方式 user password 作为变量传递